package com.cskaoyan.javase.array._4operation._0traverse;

/**
 * （一维）数组的遍历
 * 遍历，从头到尾把元素打印，访问一遍
 * 一维数组的遍历，应该使用for循环
 *
 * 通过写数组的遍历的过程,写代码不是一蹴而就的,需要不断的测试,不断的修正,然后得出最佳的代码,这叫"代码的迭代"
 *
 * @since 11:45
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        /*System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);*/

        // arr = null;
        arr = new int[0];

        // 数组的for循环遍历是常见操作，是由快捷键的
        // 数组名.fori
        traverse6(arr);

    }

    // 使用方法来复用代码
    // 快捷键ctrl + alt + m来提取代码中片段，作为一个方法
    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    /*
        改进一下:
        元素都在一行打印,并且都装在"[]"中括号里面
        比如: [1, 2, 3]
     */
    public static void traverse2(int[] arr) {
        System.out.print("[");
        // 'for' loop replaceable with 'foreach'
        for (int i = 0; i < arr.length; i++) {
            /*// 判断如果是最后一个元素,不加空格,直接打印元素,退出循环即可
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
                break;
            }*/
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    /*
        改进一下,使得方法能够接受null的输入,而不报错终止
        避免空指针异常,最常见的就是if判断

     */
    public static void traverse3(int[] arr) {
        // 判断arr不等于null时,才去做遍历
        if (arr != null) {
            // arr一定不是null
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + ", ");
            }
            System.out.println("\b\b]");
            // if处理完后,要结束方法
            return;
        }
        // 程序运行到这里,arr一定等于null
        System.out.println("您输入的数据有误,请重新输入!");
    }

    /*
        改进:
        if当中做判断执行的代码,应该越少越好
        代码会越清晰,可读性越好
     */
    public static void traverse4(int[] arr) {
        // 判断arr不等于null时,才去做遍历
        if (arr == null) {
            // 等于null的情况处理
            System.out.println("您输入的数据有误,请重新输入!");
            return;
        }
        // arr一定不是null
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    /*
        改进一下: 使得方法能够接收长度为0的数组的输入

     */
    public static void traverse5(int[] arr) {
        // 判断arr不等于null时,才去做遍历
        /*
        逻辑与或,多数情况下,无脑用短路的就可以了
        尤其是下面这种情况,不用短路的会报错
         */
        if (arr == null || arr.length == 0) {
            // 等于null的情况处理
            System.out.println("您输入的数据有误,请重新输入!");
            return;
        }
        // arr一定不是null
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    /*
        假如希望长度为0的数组,有输出
        但输出[]
     */
    public static void traverse6(int[] arr) {
        // 判断arr不等于null时,才去做遍历
        if (arr == null) {
            // 等于null的情况处理
            System.out.println("您输入的数据有误,请重新输入!");
            return;
        }
        // 判断是够长度为0,注意这时应该保证数组不是null,否者会空指针异常
        if (arr.length == 0) {
            System.out.println("[]");
            return;
        }

        // arr一定不是null
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }


}
